package 华为OD机试B卷复用题.基础题;

import utils.MyUtil;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class HJ31_靠谱的车 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner(new File("src/main/java/华为OD机试B卷复用题/基础题/input/31.txt"));
        MyUtil.START();
        //        Solution(in);
        Solution2(in);
        //        Solution3(in);
        MyUtil.END();
    }

    // 方法一：暴力解，能拿点分，但无法满分。
    static void Solution(Scanner in) {
        int N = 352;
        int tiaoguo = 0;
        for (int i = 1; i <= N; i++) {
            if ((i + "").contains("4")) {
                tiaoguo++;
            }
        }
        System.out.println(N - tiaoguo);
    }

    // 方法二：类似位运算+排列组合。对于每个位置i，计算它左边的数 left 右边的位数 right，进行运算，具体看代码。
    static void Solution2(Scanner in) {
        String n = in.nextLine();
        int tiaoguo = 0;
        int len = n.length();
        for (int i = 0; i < len; i++) {
            int nowNum = (int) (n.charAt(i) - '0');
            int left = 0;
            if (i != 0) {
                left = Integer.parseInt(n.substring(0, i));
            }
            if (nowNum > 4) {
                left += 1;
            }
            int right = len - i - 1;
            tiaoguo += left * Math.pow(9, right);
        }
        System.out.println(Integer.parseInt(n) - tiaoguo);
    }

    // 方法三：没看懂
    static void Solution3(Scanner sc) {
        int n = sc.nextInt();
        int ans = n;
        int temp = 0;
        int k = 0; // 进制内含4的个数
        int j = 1; // 4开头的数字
        while (n > 0) {
            if (n % 10 > 4) {
                temp += (n % 10 - 1) * k + j;
            } else {
                temp += (n % 10) * k;
            }
            // 进制数内的含4个数
            k = k * 9 + j;
            j *= 10;
            n /= 10;
        }

        System.out.println(ans - temp);
    }
}
